package com.agv.core.dao.dataExtractor;

import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;

import org.springframework.dao.DataAccessException;
import org.springframework.jdbc.core.ResultSetExtractor;

import com.agv.core.objectDomain.Funcion;
import com.agv.core.objectDomain.Modulo;
import com.agv.core.objectDomain.SubModulo;

public class ModuloResultSetExtractor implements ResultSetExtractor {

	public ArrayList<Modulo> extractData(ResultSet rs) throws SQLException,
			DataAccessException {
		Modulo modulo = null;
		SubModulo subModulo = null;
		Funcion funcion = new Funcion();

		Map<Integer, Integer> mMap = new HashMap<Integer, Integer>();
		Map<Integer, Integer> smMap = new HashMap<Integer, Integer>();

		ArrayList<Modulo> modulos = new ArrayList<Modulo>();

		int mIndex = 0;
		int smIndex = 0;

		while (rs.next()) {
			modulo = new Modulo();
			subModulo = new SubModulo();
			funcion = new Funcion();

			Integer idModulo = rs.getInt("id_modulo");
			modulo.setIdModulo(idModulo);
			modulo.setNbModulo(rs.getString("nb_modulo"));

			if (!modulos.contains(modulo)) {
				modulos.add(mIndex++, modulo);
				mMap.put(modulo.getIdModulo(), mIndex);
				smIndex = 0;
			}

			Integer idSubModulo = rs.getInt("id_submodulo");
			subModulo.setIdSubModulo(idSubModulo);
			subModulo.setNbSubModulo(rs.getString("nb_submodulo"));

			if (!modulos.get(mMap.get(idModulo) - 1).getSubModulos().contains(
					subModulo)) {
				modulos.get(mMap.get(idModulo) - 1).getSubModulos().add(
						smIndex++, subModulo);
				smMap.put(subModulo.getIdSubModulo(), smIndex);
			}

			funcion.setIdFuncion(rs.getInt("id_funcion"));
			funcion.setNbFuncion(rs.getString("nb_funcion"));
			funcion.setNbRuta(rs.getString("nb_ruta"));

			modulos.get(mMap.get(idModulo) - 1).getSubModulos().get(
					smMap.get(idSubModulo) - 1).getFunciones().add(funcion);

		}

		return modulos;
	}
}
